package com.xuecheng.media.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.xuecheng.base.model.po.PageParams;
import com.xuecheng.base.model.po.PageResult;
import com.xuecheng.base.model.po.RestResponse;
import com.xuecheng.media.model.dto.QueryMediaParamsDto;
import com.xuecheng.media.model.dto.UploadFileParamsDto;
import com.xuecheng.media.model.dto.UploadFileResultDto;
import com.xuecheng.media.model.po.MediaFiles;
import io.minio.errors.*;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import java.io.File;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * @description 媒资文件管理业务类
 */
public interface MediaFileService extends IService<MediaFiles> {

 /**
  * @description 媒资文件查询方法
  * @param pageParams 分页参数
  * @param queryMediaParamsDto 查询条件
 */
  PageResult<MediaFiles> queryMediaFiels(Long companyId, PageParams pageParams, QueryMediaParamsDto queryMediaParamsDto);

 /**
  * @description 上传文件
  * @param uploadFileParamsDto  上传文件信息
  * @param folder  文件目录,如果不传则默认年、月、日
  * @return com.xuecheng.media.model.dto.UploadFileResultDto 上传文件结果
  */
  UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto, byte[] bytes, String folder, String objectName);

 /**
  * @description 将文件信息添加到文件表
  * @param companyId  机构id
  * @param fileMd5  文件md5值
  * @param uploadFileParamsDto  上传文件的信息
  * @param bucket  桶
  * @param objectName 对象名称
  * @return com.xuecheng.media.model.po.MediaFiles
  */
 @Transactional
  MediaFiles addMediaFilesToDb(Long companyId,String fileMd5,UploadFileParamsDto uploadFileParamsDto,String bucket,String objectName);

 RestResponse<Boolean> checkFile(String fileMd5) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException;

 /**
  * @description 检查分块是否存在
  * @param fileMd5  文件的md5
  * @param chunkIndex  分块序号
  */
 RestResponse<Boolean> checkChunk(String fileMd5, int chunkIndex);


 RestResponse uploadChunk(String fileMd5,int chunk,byte[] bytes);

 RestResponse mergeChunks(Long companyId,String fileMd5,int chunkTotal,UploadFileParamsDto uploadFileParamsDto);


 MediaFiles getFileById(String mediaId);

 //根据桶和文件路径从minio下载文件
 File downloadFileFromMinIO(File file, String bucket, String objectName);

 void addMediaFilesToMinIO(String filePath, String bucket, String objectName);


 RestResponse<String> deleteMedia(String mediaId);
}
